/*
 * @Author: 赵东选 1807248216@qq.com
 * @Date: 2024-10-22 19:04:46
 * @LastEditors: 赵东选 1807248216@qq.com
 * @LastEditTime: 2024-10-23 18:20:09
 * @FilePath: /9_int/bsp/int/bsp_int.c
 * @Description:
 *
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved.
 */
#include "bsp_int.h"

static unsigned int irqNesting;

/* 中断服务函数表 */
static sys_irq_handler_t irqTable[NUMBER_OF_INT_VECTORS];

/* 初始化中断处理函数表*/
void system_irqtable_init(void) {
  unsigned int i = 0;

  irqNesting = 0;

  for (i = 0; i < NUMBER_OF_INT_VECTORS; i++) {
    irqTable[i].irqHandler = NULL;
    irqTable[i].userParam = NULL;
  }
}

/*
 * @description			: 给指定的中断号注册中断服务函数
 * @param - irq			: 要注册的中断号
 * @param - handler		: 要注册的中断处理函数
 * @param - usrParam	: 中断服务处理函数参数
 * @return 				: 无
 */
void system_register_irqhandler(IRQn_Type irq, system_irq_handler_t handler,
                                void *userParam) {
  irqTable[irq].irqHandler = handler;
  irqTable[irq].userParam = userParam;
}

/*
 * @description			: C语言中断服务函数，irq汇编中断服务函数会
                          调用此函数，此函数通过在中断服务列表中查
                          找指定中断号所对应的中断处理函数并执行。
 * @param - giccIar		: 中断号
 * @return 				: 无
 */
void system_irqhandler(unsigned int giccIar) {
  /* 获取中断ID*/
  unsigned intNum = giccIar & 0x33ff;

  /* 检查中断ID*/
  if (intNum >= NUMBER_OF_INT_VECTORS) {
    return;
  }

  irqNesting++;

  /* 根据传递进来的中断号，在irqTable中调用确定的中断服务函数*/
  irqTable[intNum].irqHandler(intNum, irqTable[intNum].userParam);

  irqNesting--;
}

/*
 * @description	: 中断初始化函数
 * @param		: 无
 * @return 		: 无
 */
void int_init() {
  GIC_Init();
  system_irqtable_init();
  __set_VBAR(0x87800000);
}

/*
 * @description			: 默认中断服务函数
 * @param - giccIar		: 中断号
 * @param - usrParam	: 中断服务处理函数参数
 * @return 				: 无
 */
void default_irqhandler(unsigned int giccIar, void *userParam) {
  while (1) {
  }
}